from logging import exception
from rest_framework import exceptions
from django.template.context_processors import request
from rest_framework import serializers
from apps.absent.models import Absent, AbsentType, AbsentStatusChoices
from apps.oaauth.serializers import UserSerializer
from .utils import get_responser

# AbsentTypeSerializer类用于序列化缺勤类型模型AbsentType
class AbsentTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = AbsentType  # 设置序列化的模型为AbsentType
        fields = '__all__'  # 设置序列化的字段为模型的所有字段

# AbsentSerializer类用于序列化缺勤记录模型Absent
class AbsentSerializer(serializers.ModelSerializer):
    absent_type = AbsentTypeSerializer(read_only=True)  # 设置关联的缺勤类型为只读，使用AbsentTypeSerializer序列化
    absent_type_id = serializers.IntegerField(write_only=True)  # 设置缺勤类型ID为仅写字段
    requester = UserSerializer(read_only=True)  # 设置请求者为只读，使用UserSerializer序列化
    responser = UserSerializer(read_only=True)  # 设置审批人(responser)为只读，使用UserSerializer序列化

    class Meta:
        model = Absent  # 设置序列化的模型为Absent
        fields = '__all__'  # 序列化模型的所有字段

    # validate_absent_type_id方法用于验证缺勤类型ID是否存在
    def validate_absent_type_id(self, value):
        # 检查AbsentType模型中是否存在主键为value的记录
        if not AbsentType.objects.filter(pk=value).exists():
            # 如果不存在，抛出ValidationError
            raise exceptions.ValidationError("考勤类型不存在")
        return value  # 如果验证通过，返回值

    # create方法用于创建缺勤记录实例
    def create(self, validated_data):
        request = self.context['request']  # 从序列化器的上下文中获取请求对象
        user = request.user  # 获取当前请求的用户
        responser = get_responser(request)  # 调用get_responser函数获取审批人对象

        # 根据审批人是否存在，设置缺勤记录的状态
        if responser is None:
            validated_data['status'] = AbsentStatusChoices.PASS  # 如果没有审批人，状态设置为通过(PASS)
        else:
            validated_data['status'] = AbsentStatusChoices.AUDITING  # 如果有审批人，状态设置为审核中(AUDITING)

        # 创建Absent对象，使用验证后的数据以及请求者和审批人
        absent = Absent.objects.create(**validated_data, requester=user, responser=responser)
        print(absent)  # 打印创建的缺勤记录对象
        return absent  # 返回创建的缺勤记录实例

    # update方法用于更新缺勤记录实例
    def update(self, instance, validated_data):
        # 检查缺勤记录状态是否为审核中，如果不是则禁止更新
        if instance.status != AbsentStatusChoices.AUDITING:
            raise exceptions.APIException(detail='不能修改已经确定的请假数据')  # 抛出异常

        request = self.context['request']  # 获取请求对象
        user = request.user  # 获取当前请求的用户

        # 检查当前用户是否有权限处理该缺勤记录（审批人是否为当前用户）
        if instance.responser.uid != user.uid:
            raise exceptions.APIException(detail='您无权处理该考勤')  # 抛出无权限异常

        # 更新缺勤记录的状态和审批内容
        instance.status = validated_data['status']
        instance.response_content = validated_data['response_content']
        instance.save()  # 保存实例到数据库
        return instance  # 返回更新后的缺勤记录实例
